import tool from "@/utils/tool.js";

let BASE_URL = 'http://localhost:8080';
let excludeFilterUrls = ['/user/login', '/user/register'];

function http(param) {
  let url = param.url;
  let method = param.method;
  let header = {...param.header};
  let data = {...param.data};
  let showLoading = param.showLoading || false;

  // 增加超时时间到 30 秒
  const TIMEOUT = 30000; 

  // 修改token的处理
  let token = tool.data.get('token');
  if (token) {
    header['Authorization'] = token;
  } else if (!excludeFilterUrls.includes(url)) {
    uni.switchTab({
      url: '/pages/mine/mine'
    });
    return Promise.reject(new Error('未登录'));
  }

  if (showLoading) {
    uni.showLoading();
  }

  return new Promise((resolve, reject) => {
    // 添加请求计时器
    const timeoutTimer = setTimeout(() => {
      uni.hideLoading();
      uni.showToast({
        title: '请求超时，请检查网络',
        icon: 'none'
      });
      reject(new Error('请求超时'));
    }, TIMEOUT);

    uni.request({
      url: BASE_URL + url,
      data: data,
      method: method,
      header: header,
      timeout: TIMEOUT, // 修改超时时间
      success: (res) => {
        clearTimeout(timeoutTimer); // 清除超时计时器
        if (showLoading) {
          uni.hideLoading();
        }

        console.log('HTTP Response:', res); // 添加日志

        // 检查HTTP状态码
        if (res.statusCode !== 200) {
          console.error('HTTP状态码错误:', res.statusCode);
          reject(new Error(`HTTP错误: ${res.statusCode}`));
          return;
        }

        // 对于状态码200但响应体为空的情况，也认为是成功
        if (res.statusCode === 200 && !res.data) {
          console.log('请求成功，但响应体为空');
          resolve({
            code: 200,
            msg: '操作成功',
            data: null
          });
          return;
        }

        // 处理成功响应
        if (res.data.code === 1 || res.data.code === 200 || res.statusCode === 200) {
          console.log('请求成功，返回数据:', res.data);
          resolve(res.data || { code: 200, msg: '操作成功', data: null });
        } else if (res.statusCode === 401 || res.data.code === 401) {
          console.log('未授权，需要重新登录');
          // 清除登录信息
          tool.data.remove('username');
          tool.data.remove('imgurl');
          tool.data.remove('token');
          
          const app = getApp();
          if (app && app.globalData) {
            app.globalData.isLoggedIn = false;
            app.globalData.userInfo = null;
          }

          uni.showToast({
            title: '登录已过期，请重新登录',
            icon: 'none'
          });
          
          uni.switchTab({
            url: '/pages/mine/mine'
          });
          
          reject(new Error('登录已过期'));
        } else {
          console.error('业务错误:', res.data);
          reject(new Error(res.data.msg || '请求失败'));
        }
      },
      fail: (err) => {
        clearTimeout(timeoutTimer); // 清除超时计时器
        console.error('请求失败:', err);
        if (showLoading) {
          uni.hideLoading();
        }
        
        // 优化错误提示
        let errorMsg = '请求失败';
        if (err.errMsg.includes('timeout')) {
          errorMsg = '请求超时，请检查网络';
        } else if (err.errMsg.includes('fail')) {
          errorMsg = '网络连接失败，请检查网络设置';
        }
        
        uni.showToast({
          title: errorMsg,
          icon: 'none',
          duration: 2000
        });
        
        reject(err);
      }
    });
  });
}

export default http;